package com.zenithmind.coding.pojo.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 代码提交VO
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "代码提交VO")
public class SubmissionVO {

    /**
     * 提交ID
     */
    @Schema(description = "提交ID")
    private String id;

    /**
     * 问题ID
     */
    @Schema(description = "问题ID")
    private String problemId;

    /**
     * 问题标题
     */
    @Schema(description = "问题标题")
    private String problemTitle;

    /**
     * 用户ID
     */
    @Schema(description = "用户ID")
    private String userId;

    /**
     * 用户名称
     */
    @Schema(description = "用户名称")
    private String userName;

    /**
     * 编程语言
     */
    @Schema(description = "编程语言")
    private String language;

    /**
     * 源代码
     */
    @Schema(description = "源代码")
    private String sourceCode;

    /**
     * 代码长度
     */
    @Schema(description = "代码长度")
    private Integer codeLength;

    /**
     * 提交状态（0-等待评判，1-评判中，2-通过，3-错误答案，4-时间超限，5-内存超限，6-运行错误，7-编译错误，8-系统错误）
     */
    @Schema(description = "提交状态（0-等待评判，1-评判中，2-通过，3-错误答案，4-时间超限，5-内存超限，6-运行错误，7-编译错误，8-系统错误）")
    private Integer status;

    /**
     * 状态名称
     */
    @Schema(description = "状态名称")
    private String statusName;

    /**
     * 状态描述
     */
    @Schema(description = "状态描述")
    private String statusMessage;

    /**
     * 运行时间（毫秒）
     */
    @Schema(description = "运行时间（毫秒）")
    private Integer runTime;

    /**
     * 运行内存（KB）
     */
    @Schema(description = "运行内存（KB）")
    private Integer runMemory;

    /**
     * 通过测试用例数
     */
    @Schema(description = "通过测试用例数")
    private Integer passedTestcases;

    /**
     * 总测试用例数
     */
    @Schema(description = "总测试用例数")
    private Integer totalTestcases;

    /**
     * 编译信息
     */
    @Schema(description = "编译信息")
    private String compileInfo;

    /**
     * 运行错误信息
     */
    @Schema(description = "运行错误信息")
    private String errorInfo;

    /**
     * 代码得分
     */
    @Schema(description = "代码得分")
    private Integer score;

    /**
     * 代码质量评分
     */
    @Schema(description = "代码质量评分")
    private Double qualityScore;

    /**
     * 代码复杂度
     */
    @Schema(description = "代码复杂度")
    private Integer complexity;

    /**
     * 是否最佳提交（0-否，1-是）
     */
    @Schema(description = "是否最佳提交（0-否，1-是）")
    private Integer isBest;

    /**
     * 是否公开（0-私有，1-公开）
     */
    @Schema(description = "是否公开（0-私有，1-公开）")
    private Integer isPublic;

    /**
     * 是否分享（0-否，1-是）
     */
    @Schema(description = "是否分享（0-否，1-是）")
    private Integer isShared;

    /**
     * 提交来源（1-网页，2-API，3-IDE插件）
     */
    @Schema(description = "提交来源（1-网页，2-API，3-IDE插件）")
    private Integer submitSource;

    /**
     * 提交来源名称
     */
    @Schema(description = "提交来源名称")
    private String submitSourceName;

    /**
     * 竞赛ID（如果是竞赛提交）
     */
    @Schema(description = "竞赛ID（如果是竞赛提交）")
    private String contestId;

    /**
     * 作业ID（如果是作业提交）
     */
    @Schema(description = "作业ID（如果是作业提交）")
    private String assignmentId;

    /**
     * 评判开始时间
     */
    @Schema(description = "评判开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime judgeStartTime;

    /**
     * 评判结束时间
     */
    @Schema(description = "评判结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime judgeEndTime;

    /**
     * 评判耗时（毫秒）
     */
    @Schema(description = "评判耗时（毫秒）")
    private Long judgeDuration;

    /**
     * 评判机ID
     */
    @Schema(description = "评判机ID")
    private String judgeId;

    /**
     * 是否抄袭（0-否，1-是）
     */
    @Schema(description = "是否抄袭（0-否，1-是）")
    private Integer isPlagiarism;

    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @Schema(description = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 相对时间
     */
    @Schema(description = "相对时间")
    private String relativeTime;

    /**
     * 通过率
     */
    @Schema(description = "通过率")
    private Double passRate;

    /**
     * 是否可以查看代码
     */
    @Schema(description = "是否可以查看代码")
    private Boolean canViewCode;

    /**
     * 排名
     */
    @Schema(description = "排名")
    private Integer ranking;
}
